#include "common.hpp"

static const char *optString = "h?";

static const struct option longOpts[] = {
	{ "help", no_argument, NULL, 'h' },
	{ 0,0,0,0}
};

int main (int argc, char* const argv[]) {

	ipc::shared_memory_with_exceptions<size_t> vacias	( my_ftok(COUNTER|VACIAS));
	ipc::shared_memory_with_exceptions<size_t> llenas	( my_ftok(COUNTER|LLENAS));
	ipc::shared_memory_with_exceptions<size_t> tapadas	( my_ftok(COUNTER|TAPADAS));
//	ipc::shared_memory_with_exceptions<size_t> etiquetadas (my_ftok(COUNTER|ETIQUETADAS));
	ipc::shared_memory_with_exceptions<size_t> listas	( my_ftok(COUNTER|LISTAS));

	ipc::semaphore_with_exceptions mutex_vacias ( my_ftok(MUTEX|VACIAS),0);
	ipc::semaphore_with_exceptions mutex_llenas ( my_ftok(MUTEX|LLENAS),0);	
	ipc::semaphore_with_exceptions mutex_tapadas ( my_ftok(MUTEX|TAPADAS),0);
//	ipc::semaphore_with_exceptions mutex_etiquetadas ( my_ftok(MUTEX|ETIQUETADAS),0);
	ipc::semaphore_with_exceptions mutex_listas ( my_ftok(MUTEX|LISTAS),0);

//	ipc::semaphore_vector mutex_llenadoras ( my_ftok(MUTEX|LLENADORA),MAX_LLENADORAS );
//	ipc::semaphore_with_exceptions mutex_tapadora ( my_ftok(MUTEX|TAPADORA),0);
//	ipc::semaphore_with_exceptions mutex_etiquetadora ( my_ftok(MUTEX|ETIQUETADORA),0);

	int longIndex = 0;
	int option = 0;
	bool ayuda = false;

	while ( (option = getopt_long(argc,argv,optString,longOpts,&longIndex) ) != EOF ) {
		switch (option) {
			case '?':
			case 'h':
			case ':':
				ayuda = true;
				break;
			default:
				break;
		}
	}

	if ( ayuda ) {
		std::cerr << "Proceso para revisar el estado del stok." << std::endl;
		std::cerr << "\tUso: " << argv[0] << " [-h]" << std::endl;
		std::cerr << "\tParametros:" << std::endl;
		std::cerr << "\t\t-h,--help:\tMostrar este mensaje de ayuda." << std::endl;

		return (ayuda) ? 0 : -1;
	}

	try {
		mutex_vacias.get	 (PERMITS);
		vacias.get		 (PERMITS);
		mutex_llenas.get	 (PERMITS);
		llenas.get		 (PERMITS);
		mutex_tapadas.get	 (PERMITS);
		tapadas.get		 (PERMITS);
//		mutex_etiquetadas.get(PERMITS);
//		etiquetadas.get	 (PERMITS);
		mutex_listas.get	 (PERMITS);
		listas.get		 (PERMITS);

		logger << "Stok: Inicio." << nl;

		mutex_vacias.wait();
		logger << "Stock: Botellas vacias: " << (*vacias) << "." << nl;
		mutex_vacias.signal();
		mutex_llenas.wait();
		logger << "Stock: Botellas llenas: " << (*llenas) << "." << nl;
		mutex_llenas.signal();
		mutex_tapadas.wait();
		logger << "Stock: Botellas tapadas: " << (*tapadas) << "." << nl;
		mutex_tapadas.signal();
		mutex_listas.wait();
		logger << "Stock: Botellas listas: " << (*listas) << "." << nl;
		mutex_listas.signal();

	} catch (ipc::exception& e) {
		logger << "Stock: " << e.what() << "." << nl;
		exit(-1);
	}

	logger << "Stock: Fin." << nl;	
	return 0;
}

